iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
自我挑戰組

laravel+vue 學習系列 第 18

Day18. 網站後台建立之四

  • 分享至 

  • xImage
  •  

一、處理使用者輸入內容

  • 接收 request 和驗證
    // 接收一般欄位
    $input = $request->all();
    // 接收檔案
    $files = $request->file('productImg');
    
    // 驗證規則
    // 陣列欄位 * 在 9.x 版有提供 :index, :position 來輸出索引
    // 8.x 無法使用
    $rules = [
        'name' => 'required|unique:pj_product|max:255',
        'price' => 'required|integer',
        'market_price' => 'nullable|integer',
        'simple_intro' => 'nullable|string|max:255',
        'intro' => 'required|string|max:2000',
        'part_number' => 'nullable|string|max:100',
        'start_date' => 'required|date_format:Y-m-d',
        'productImg.*' => 'mimes:jpg,jpeg,png|max:2000',
        'category_name_parent' => 'string',
        'category_parent' => 'integer',
        'category_name_childen' => 'string',
        'category_childen' => 'integer',
        'spec_parent_name.*' => 'string',
        'spec_parent.*' => 'integer',
        'spec_name_childen.*' => 'string',
        'spec_childen.*' => 'integer',
        'spec_reserve.*' => 'integer|min:1',
        'spec_low_reserve.*' => 'integer|min:1',
        'spec_volume.*' => 'string|max:100',
        'spec_weight.*' => 'string|max:100',
        'spec_order.*' => 'integer',
    ];
    
    // 設定顯示的錯誤文字
    // 陣列欄位 {欄位名稱}.*.{驗證規則}
    $rule_text =[            
        'productImg.*.mimes' => '僅能上傳格視為 jpg,jpeg,png 圖片',
        'productImg.*.max' => '圖片最大尺寸為 2MB',
        'category_name_parent.string' => '全站類別名稱須為文字',
        'category_parent.integer' => '全站類別id必須為數字',
        'category_name_childen.string' => '全站子類別名稱須為文字',
        'category_childen.integer' => '全站子類別id必須為數字',
        'spec_parent_name.*.string' => '規格分類名稱須為文字',
        'spec_parent.*.integer' => '規格分類id須為數字',
        'spec_name_childen.*.string' => '規格子分類名稱須為文字',
        'spec_childen.*.integer' => '規格子分類id須為數字',
        'spec_reserve.*.integer' => '庫存必須為數字',
        'spec_reserve.*.min' => '庫存數須大於等於 :min',
        'spec_low_reserve.*.integer' => '最小警告值須為數字',
        'spec_low_reserve.*.min' => '最小警告值須大於等於 :min',
        'spec_volume.*.string' => '材積須為數字',
        'spec_volume.*.max' => '材積值長度最大為 :max',
        'spec_weight.*.string' => '重量須為文字',
        'spec_weight.*.max' => '重量最大長度須為 :max',
        'spec_order.*.integer' => '排序值須為數字',
    ];
    
    // 驗證若有錯誤回傳結果
    $validator = Validator::make($input, $rules, $rule_text);
    if($validator->fails()){
        return back()->withErrors($validator)->withInput($input);
    }

https://ithelp.ithome.com.tw/upload/images/20220923/20128127cGwCrfFCFQ.png

  • 新建商品資料
    // 商品基本資料
    $p_input = $request->only([
        'name',
        'price',
        'market_price',
        'simple_intro',
        'intro',
        'part_number',
        'start_date'
    ]);
    if ( !isset($p_input['market_price']) || empty($p_input['market_price']) ) {
        $p_input['market_price'] = 0;
    } 
    if ( !isset($p_input['simple_intro']) || empty($p_input['simple_intro']) ) {
        $p_input['simple_intro'] = '';
    } 
    if ( !isset($p_input['simple_intro']) || empty($p_input['simple_intro']) ) {
        $p_input['part_number'] = '';
    } 
    $product = \App\Models\Shop\Product::create($p_input);
    $product_id = $product->id;    
  • 處理圖片
    // 取得容器的 class, 要拿到 Model id 存到資料表做關聯
    $p_class = app(\App\Models\Shop\Product::class);

    // 商品圖片
    foreach($files as $file) {
        // $file Illuminate\Http\UploadedFile 
        // 使用 storeAs 方法存圖片, 會呼叫 Storage 方法
        // 儲存位置 storage/app/images
        $path = $file->storeAs('images', time().".".$file->extension());
        
        // 儲存圖片資訊到資料表
        // 全站都可以使用
        // 用 data_id 區隔不同 Models 下的圖片
        $img_input = [
            'data_id' => $p_class->get_model_id(), 
            'item_id' => $product_id,
            'path' => $path,
            'data_type' => $file->getClientMimeType(),
            'description' => $file->getClientOriginalName()
        ];
        $product_img  = \App\Models\Shop\ProductImage::create($img_input);
    }
  • 處理規格內容
    foreach($input['spec_parent_name'] as $k => $spec_name ) {

        $spec_input = [
            'category_id' => $input["spec_childen"][$k],
            'product_id' => $product_id,
            'reserve_num' => $input["spec_reserve"][$k],
            'low_reserve_num' => $input["spec_low_reserve"][$k],
            'volume' => $input["spec_volume"][$k],
            'weight' => $input["spec_weight"][$k],
            'order' => $input["spec_order"][$k]
        ];
        $p_spec = \App\Models\Shop\ProductSpec::create($spec_input);

    }
  • 處理全站分類內容
    // 儲存全站分類關係到資料表
    $category_input = [
        'data_id' => $p_class->get_model_id(),
        'category_id' => $input['category_childen'],
        'item_id' => $product_id
    ];
    $category = \App\Models\RelationShipCatory::create($category_input);

二、列表關聯

  • Model Product 建立 fucntion 回傳關聯資料
    // $product->image 取回商品圖片
    public function images()
    {
        $images = MyImage::where('item_id', $this->id)
                  ->where('data_id', $this->get_model_id())->get();
        return $images;
    }
    
    // $product->category 取回全站分類
    public function category() {
        return $this->hasOneThrough(\App\Models\Categroy::class,
                                    \App\Models\RelationShipCatory::class, 
                                    'item_id', 'id', 'id', 'category_id');
    }

https://ithelp.ithome.com.tw/upload/images/20220923/201281275DO5x0atVb.png

github 進版
剩下的天繼續...


上一篇
Day.17 網站後台建立之三 (與儲存與取回 Storage)
下一篇
Day19. 用戶驗證與授權
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言